CentOS 的 rpm 套件管理器預設沒有 MySQL repository,而是預設使用 MySQL 的妹妹 MariaDB。MySQL 與 MaraiDB 用起來基本上沒什麼差別,甚至連 MySQL Workbench 也通用。但是 .NET 用來與 MySQL/MariaDB 溝通的套件更新速度有差,以 .NET 5 來說,兩者的 release 時間差了約 2 個月。
所以在選擇 MySQL 或 MariaDB 的時候,就必須考量一下自己的情況了。MySQL 的優點是支援速度比較快,而 MariaDB 則是可以完全不用擔心將來他的授權會變。本文系列選擇使用 MySQL 當範例。
CentOS 預設沒有包含 MySQL 在 yum 的 repository裡(但是 MySQL 的妹妹 MariaDB 有),所以我們要透過 wget 來下載這個 repository。首先,先來安裝 wgetsudo yum install wget
開啟瀏覽器到 MySQL 的網站找 yum 的 MySQL repository
https://dev.mysql.com/downloads/repo/yum/
然後複製下面的 repository name
將剛剛複製的 repository name 貼到 wget 指令開始下載這個 repository 的資訊wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
Repository 的資訊下載下來之後,再把它加入 rpm 套件管理器sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm
加入完成後開始安裝 MySQL Serversudo yum install mysql-server
一樣用 systemctl 指令來啟動 MySQL sudo systemctl start mysqld
MySQL 預設會隨著開機啟動,所以不必再跑 systemctl enable 指令
sudo systemctl status mysqld
安裝完之後,MySQL 會在 /var/log/mysqld.log 這個檔案裡產生一組亂數的密碼,我們可以用下面的指令將它輸出到螢幕上 sudo grep 'temporary password' /var/log/mysqld.log
[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 安裝時產生的密碼
輸出之後別把畫面洗掉,馬上就要用到這組密碼。輸入下列指令開始設定 MySQL sudo mysql_secure_installation
一開始 MySQL 會要求我們輸入剛剛的預設密碼,這邊有點煩的是不能用複製的,要用手 key 才行。
Enter password for user root: #手動 Key 密碼
認證成功之後,需要輸入一組新的密碼
Securing the MySQL server deployment.
Enter password for user root:
The existing password for the user account root has expired. Please set a new password.
New password:
Re-enter new password:
以前完年的帳號=root密碼=root不能用了QQ…筆者自己測大概最少要 10 碼而且要包含大小寫英文、數字跟符號
換完密碼之後,馬上又會再問一次要不要換密碼(有事嗎…),因為我們才剛剛換過,這邊就輸入 N 不要
Change the password for root ? ((Press y|Y for Yes, any other key for No): N
接下來有一個選項會禁止 root 帳號從外部連線,只能從本機(VM)連,這個設定雖然會增加安全性但是頗麻煩,如果想要從外部用 root 連線,請注意下面這個設定,輸入 N 讓 root 保持可以對外連線。
Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
接下來除了上面的 root 對外連線看個人喜好要不要開放,其他就是一直按 y 然後 enter 就好
如果上面的設定沒有阻擋 root 對外開放可以跳過這個小節,直接都用 root 帳號操作。
設定完 MySQL 之後,我們來新增一個可以從外部連進來的使用者。首先,我們要先進到 MySQL 的命列列模式,一樣在 Linux shell,輸入mysql -u root -p
接著輸入 root 的密碼。認證成功之後,就會看到命令的開頭變成
mysql>
再來,輸入建立使用者的 MySQL 指令CREATE USER '使用者名稱'@'允許連線的IP' IDENTIFIED BY '使用者密碼';
允許連線的 IP 可以打百分比符號(%)允許所有來源 IP 連線。例如
CREATE USER 'ironman'@'%' IDENTIFIED BY 'user_password';
接著要來填筆者自己造的坑(跪)。筆者在自己的電腦是使用 installer 安裝整套 Developer Default,裡面包含了一個範例資料庫 “world”,但是在 CentOS 用 yum 裝不會有這個範例資料庫,所以我們要手動把它建出來,這樣前幾天的 SQL 腳本才不會出錯(再跪QAQ)。 CREATE SCHEMA `world` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci ;
建立使用者之後,要賦予這個使用者權限,為了方便 demo,這邊筆者直接給全部權限GRANT ALL PRIVILEGES ON world.* TO 'ironman'@'%';
這邊說明一下,上面指令的 ON 後面要接 「資料庫.資料表」,星號代表這個資料庫底下的資料表全給;TO 後面的是使用者名稱,小老鼠後面一樣是來源 IP。一次給全部權限不是很好的做法,正常的情況會根據不同的工程師給對應的權限,這時候就需要用以下語法分別給權限 GRANT SELECT, INSERT,...其他權限 ON 資料庫名稱.資料表名稱 TO '使用者名稱'@'允許的IP來源';
完整的權限列表請參考 MySQL 官方文件
MySQL server 端的工作搞定了,接下來我們要開啟防火牆,讓我們從自己的電腦用 MySQL Workbench 連線。請參考本系列的 Day13 把 mysql 的 3306 port 打開。
打開之後就能用剛剛創的使用者帳號登入。
登入之後,我們要來把之前在本機建的表還有資料匯入到 VM 上的 MySQL。首先,打開本機的連線,然後點上方的 Server 選單 -> Data Export
選一下要匯出的資料表以及輸出路徑
接下來點 Start Export,這個按鈕很雷,螢幕太小的話會被 SQL 執行的 Output 視窗遮住,用筆電的邦友可能要調整一下 Output 視窗才能看到這個按鈕。
匯出完成後,切換到 VM 上的 MySQL 連線,一樣在 Server 選單,選 Data Import。然後瀏覽資料夾選一下剛剛匯出的檔案,再點 Start Import。
首先 SSH 連上 VM,更新一下程式碼
cd /ironman/dotnet_api/IThomeIronman/
sudo git pull
再來用 vim 編輯正式環境用的 appsettings.json
sudo vi /ironman/dotnet_api/IThomeIronman/Ithome_2021_API/appsettings.json
"MySqlOptions": {
"ConnectionString": "Server=localhost;Database=world;Uid=root;Pwd=安裝時設定的密碼;"
}
然後重新發布 API 程式並重啟
sudo dotnet publish -c Release
sudo systemctl restart ironman_api
一切就緒之後,再到我們的瀏覽器打打看 https://之前申請的域名/api/User,應該就能看到我們 API 從 MySQL 撈資料然後回傳給我們
到此,架站、API、資料庫等躲在前端頁面後的東西大致上都完成了,明天開始,我們即將開始介紹網頁的前端。